<?php
// +----------------------------------------------------------------------
// | OneThink [ WE CAN DO IT JUST THINK IT ]
// +----------------------------------------------------------------------
// | Copyright (c) 2013 http://www.onethink.cn All rights reserved.
// +----------------------------------------------------------------------
// | Author: 麦当苗儿 <zuojiazi@vip.qq.com> <http://www.zjzit.cn>
// +----------------------------------------------------------------------


//有效每个商品日期列表
 function getValidTimeList($sn){
    //获取货号或者是自编码
    $yw_stockinoutModel= M("yw_stockinout");
    //左连接语句
    $join="left join ".C('DB_PREFIX')."yw_stockinout_item stockout on  stockins.id=stockout.stockinoutid";
    //查询条件
    $where=array();
    $_string=" 1=1 ";
    $_string.=" and stockins.type in (1,2,3) and stockout.valid_time <>0 and stockout.is_use_validtime=0   and stockout.is_type_validtime=0";
    $_string.=" and stockout.goods_sn='{$sn}' ";
    $where["_string"]=$_string;
    //有效日期分组，保证唯一性
    $groupby=" FROM_UNIXTIME(stockout.valid_time,'%Y-%m-%d')";
    //新旧排序
    $orderby="stockout.valid_time asc";
    //字段过滤
    $field="FROM_UNIXTIME(stockout.valid_time,'%Y-%m-%d') as valid_time";
    $result_list= $yw_stockinoutModel->field($field )->alias("stockins")->join($join)->where($where)->order($orderby)->group($groupby)->limit(5)->select();
    return $result_list;
}

/**
 * 后台公共文件
 * 主要定义后台公共函数库
 */

/* 解析列表定义规则*/
/**
 * DOTO
 * @return string 生成唯一订单号（生成规则：前缀+日期+顺序码）
 */
function build_order_no($type){
    //return date('Ymd').substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8);
    $orderSn='';  //生成的唯一订单号
    $orderPrefix=getOrderNoPrefix($type); //订单的前缀
    $orderSnHalf=$orderPrefix.date('ymd');  //订单号的前半部分
    $where=array();
    if($type!=''&&$orderPrefix!=''){
        $where['type']=$type;
        $where['sn']=array('like',"$orderSnHalf%");
    }
    //查询单据号
    $maxOrderSn=M('yw_stockinout')->where($where)->order('sn desc')->getField('sn');
    if($maxOrderSn==null||$maxOrderSn==''){  //没有查找到的情况下
        $orderSn=$orderSnHalf.'0000';
    }else{
        //PU1606240009
        $shunXuSn=intval(substr($maxOrderSn,8));
        $newShunXuSn=0;  //新的顺序码
        if($shunXuSn<9999){
            $newShunXuSn=$shunXuSn+1;
            $snLength=strlen($newShunXuSn);
            if($snLength==1){
                $newShunXuSn='000'.$newShunXuSn;
            }else if($snLength==2){
                $newShunXuSn='00'.$newShunXuSn;
            }else if($snLength==3) {
                $newShunXuSn = '0'.$newShunXuSn;
            }
        }else{
            $newShunXuSn='0000';
        }
        $orderSn=$orderSnHalf.$newShunXuSn;
    }
   return $orderSn;
}

//获取订单的前缀
function getOrderNoPrefix($val){
    $str='';
    switch(intval($val)){
        case 1: $str='PU'; break;    //采购入库
        case 2: $str='DR'; break;    //销售退货入库
        case 3: $str='WN'; break;    //库存调整入库
        case 6: $str='DS'; break;    //本地销售出库
        case 7: $str='PR'; break;    //采购退货出库
        case 9: $str='WT'; break;    //库存调整出库
        default: $str='';
    }
    return $str;
}

/*
 *生成申请单的申请单号
 */
function get_business_apply_no($type){
    $orderSn='';  //生成的唯一订单号
    $orderPrefix=get_business_no_prefix($type); //订单的前缀
    $orderSnHalf=$orderPrefix.date('ymd');  //订单号的前半部分
    $where=array();
    if($type!=''&&$orderPrefix!=''){
        $where['type']=$type;
        $where['sn']=array('like',"$orderSnHalf%");
    }
    //查询单据号
    $maxOrderSn=M('yw_stockinout_apply')->where($where)->order('sn desc')->getField('sn');
    if($maxOrderSn==null||$maxOrderSn==''){  //没有查找到的情况下
        $orderSn=$orderSnHalf.'0000';
    }else{
        //PU1606240009
        $shunXuSn=intval(substr($maxOrderSn,8));
        $newShunXuSn=0;  //新的顺序码
        if($shunXuSn<9999){
            $newShunXuSn=$shunXuSn+1;
            $snLength=strlen($newShunXuSn);
            if($snLength==1){
                $newShunXuSn='000'.$newShunXuSn;
            }else if($snLength==2){
                $newShunXuSn='00'.$newShunXuSn;
            }else if($snLength==3) {
                $newShunXuSn = '0'.$newShunXuSn;
            }
        }else{
            $newShunXuSn='0000';
        }
        $orderSn=$orderSnHalf.$newShunXuSn;
    }
   return $orderSn;
}

//获取业务申请单据的前缀字母
function get_business_no_prefix($val){
    $str='';
    switch(intval($val)){
        case 1: $str='PI'; break;    //入库
        case 2: $str='PO'; break;      //提货出库
        default: $str='';
    }
    return $str;
}


/*
 *生成供货定价申请单号
 */
function get_supply_price_no(){
    $orderSn='';  //生成的唯一订单号
    $orderPrefix='SP'; //订单的前缀
    $orderSnHalf=$orderPrefix.date('ymd');  //订单号的前半部分
    $where=array();
    $where['sn']=array('like',"$orderSnHalf%");
    //查询单据号
    $maxOrderSn=M('yw_list_price')->where($where)->order('sn desc')->getField('sn');
    if($maxOrderSn==null||$maxOrderSn==''){  //没有查找到的情况下
        $orderSn=$orderSnHalf.'0000';
    }else{
        //PU1606240009
        $shunXuSn=intval(substr($maxOrderSn,8));
        $newShunXuSn=0;  //新的顺序码
        if($shunXuSn<9999){
            $newShunXuSn=$shunXuSn+1;
            $snLength=strlen($newShunXuSn);
            if($snLength==1){
                $newShunXuSn='000'.$newShunXuSn;
            }else if($snLength==2){
                $newShunXuSn='00'.$newShunXuSn;
            }else if($snLength==3) {
                $newShunXuSn = '0'.$newShunXuSn;
            }
        }else{
            $newShunXuSn='0000';
        }
        $orderSn=$orderSnHalf.$newShunXuSn;
    }
    return $orderSn;
}

/*
 *生成提款申请单的单号
 */
function get_withdrawal_apply_no(){
    $orderSn='';  //生成的唯一订单号
    $orderPrefix='TK'; //订单的前缀
    $orderSnHalf=$orderPrefix.date('ymd');  //订单号的前半部分(前缀+日期)
    $where=array();
    $where['sn']=array('like',"$orderSnHalf%");
    //查询单据号
    $maxOrderSn=M('yw_withdrawals_apply')->where($where)->order('sn desc')->getField('sn');
    if($maxOrderSn==null||$maxOrderSn==''){  //没有查找到的情况下
        $orderSn=$orderSnHalf.'0000';
    }else{
        //TK1606240009
        $shunXuSn=intval(substr($maxOrderSn,8));
        $newShunXuSn=0;  //新的顺序码
        if($shunXuSn<9999){
            $newShunXuSn=$shunXuSn+1;
            $snLength=strlen($newShunXuSn);
            if($snLength==1){
                $newShunXuSn='000'.$newShunXuSn;
            }else if($snLength==2){
                $newShunXuSn='00'.$newShunXuSn;
            }else if($snLength==3) {
                $newShunXuSn = '0'.$newShunXuSn;
            }
        }else{
            $newShunXuSn='0000';
        }
        $orderSn=$orderSnHalf.$newShunXuSn;
    }
    return $orderSn;
}

/*
 *生成新品创建的申请单单号
 */
function get_new_product_apply_no(){
    $orderSn='';  //生成的唯一订单号
    $orderPrefix='XP'; //订单的前缀
    $orderSnHalf=$orderPrefix.date('ymd');  //订单号的前半部分(前缀+日期)
    $where=array();
    $where['sn']=array('like',"$orderSnHalf%");
    //查询单据号
    $maxOrderSn=M('yw_new_product_apply')->where($where)->order('sn desc')->getField('sn');
    if($maxOrderSn==null||$maxOrderSn==''){  //没有查找到的情况下
        $orderSn=$orderSnHalf.'0000';
    }else{
        //TK1606240009
        $shunXuSn=intval(substr($maxOrderSn,8));
        $newShunXuSn=0;  //新的顺序码
        if($shunXuSn<9999){
            $newShunXuSn=$shunXuSn+1;
            $snLength=strlen($newShunXuSn);
            if($snLength==1){
                $newShunXuSn='000'.$newShunXuSn;
            }else if($snLength==2){
                $newShunXuSn='00'.$newShunXuSn;
            }else if($snLength==3) {
                $newShunXuSn = '0'.$newShunXuSn;
            }
        }else{
            $newShunXuSn='0000';
        }
        $orderSn=$orderSnHalf.$newShunXuSn;
    }
    return $orderSn;
}



function get_datagrid($tablename,$where){
    $page=I("request.page");
    $rows=I("request.rows");
    $totalcount=M($tablename)->where($where)->count();
    $entitylist=M($tablename)->where($where)->limit(($page-1)*$rows.",".$rows)->select();
    $datagrid["total"]=$totalcount;
    $datagrid["rows"]=$entitylist;
    return $datagrid;
}

function get_list_field($data, $grid){

    // 获取当前字段数据
    foreach($grid['field'] as $field){
        $array  =   explode('|',$field);
        $temp  =    $data[$array[0]];
        // 函数支持
        if(isset($array[1])){
            $temp = call_user_func($array[1], $temp);
        }
        $data2[$array[0]]    =   $temp;
    }
    if(!empty($grid['format'])){
        $value  =   preg_replace_callback('/\[([a-z_]+)\]/', function($match) use($data2){return $data2[$match[1]];}, $grid['format']);
    }else{
        $value  =   implode(' ',$data2);
    }

    // 链接支持
    if('title' == $grid['field'][0] && '目录' == $data['type'] ){
        // 目录类型自动设置子文档列表链接
        $grid['href']   =   '[LIST]';
    }
    if(!empty($grid['href'])){
        $links  =   explode(',',$grid['href']);
        foreach($links as $link){
            $array  =   explode('|',$link);
            $href   =   $array[0];
            if(preg_match('/^\[([a-z_]+)\]$/',$href,$matches)){
                $val[]  =   $data2[$matches[1]];
            }else{
                $show   =   isset($array[1])?$array[1]:$value;
                // 替换系统特殊字符串
                $href   =   str_replace(
                    array('[DELETE]','[EDIT]','[LIST]'),
                    array('setstatus?status=-1&ids=[id]',
                    'edit?id=[id]&model=[model_id]&cate_id=[category_id]',
                    'index?pid=[id]&model=[model_id]&cate_id=[category_id]'),
                    $href);

                // 替换数据变量
                $href   =   preg_replace_callback('/\[([a-z_]+)\]/', function($match) use($data){return $data[$match[1]];}, $href);

                $val[]  =   '<a href="'.U($href).'">'.$show.'</a>';
            }
        }
        $value  =   implode(' ',$val);
    }
    return $value;
}

/* 解析插件数据列表定义规则*/

function get_addonlist_field($data, $grid,$addon){
    // 获取当前字段数据
    foreach($grid['field'] as $field){
        $array  =   explode('|',$field);
        $temp  =    $data[$array[0]];
        // 函数支持
        if(isset($array[1])){
            $temp = call_user_func($array[1], $temp);
        }
        $data2[$array[0]]    =   $temp;
    }
    if(!empty($grid['format'])){
        $value  =   preg_replace_callback('/\[([a-z_]+)\]/', function($match) use($data2){return $data2[$match[1]];}, $grid['format']);
    }else{
        $value  =   implode(' ',$data2);
    }

    // 链接支持
    if(!empty($grid['href'])){
        $links  =   explode(',',$grid['href']);
        foreach($links as $link){
            $array  =   explode('|',$link);
            $href   =   $array[0];
            if(preg_match('/^\[([a-z_]+)\]$/',$href,$matches)){
                $val[]  =   $data2[$matches[1]];
            }else{
                $show   =   isset($array[1])?$array[1]:$value;
                // 替换系统特殊字符串
                $href   =   str_replace(
                    array('[DELETE]','[EDIT]','[ADDON]'),
                    array('del?ids=[id]&name=[ADDON]','edit?id=[id]&name=[ADDON]',$addon),
                    $href);

                // 替换数据变量
                $href   =   preg_replace_callback('/\[([a-z_]+)\]/', function($match) use($data){return $data[$match[1]];}, $href);

                $val[]  =   '<a href="'.U($href).'">'.$show.'</a>';
            }
        }
        $value  =   implode(' ',$val);
    }
    return $value;
}

// 获取模型名称
function get_model_by_id($id){
    return $model = M('Model')->getFieldById($id,'title');
}

// 获取属性类型信息
function get_attribute_type($type=''){
    // TODO 可以加入系统配置
    static $_type = array(
        'num'       =>  array('数字','int(10) UNSIGNED NOT NULL'),
        'string'    =>  array('字符串','varchar(255) NOT NULL'),
        'textarea'  =>  array('文本框','text NOT NULL'),
        'date'      =>  array('日期','int(10) NOT NULL'),
        'datetime'  =>  array('时间','int(10) NOT NULL'),
        'bool'      =>  array('布尔','tinyint(2) NOT NULL'),
        'select'    =>  array('枚举','char(50) NOT NULL'),
        'radio'     =>  array('单选','char(10) NOT NULL'),
        'checkbox'  =>  array('多选','varchar(100) NOT NULL'),
        'editor'    =>  array('编辑器','text NOT NULL'),
        'picture'   =>  array('上传图片','int(10) UNSIGNED NOT NULL'),
        'file'      =>  array('上传附件','int(10) UNSIGNED NOT NULL'),
    );
    return $type?$_type[$type][0]:$_type;
}

/**
 * 获取对应状态的文字信息
 * @param int $status
 * @return string 状态文字 ，false 未获取到
 * @author huajie <banhuajie@163.com>
 */
function get_status_title($status = null){
    if(!isset($status)){
        return false;
    }
    switch ($status){
        case -1 : return    '已删除';   break;
        case 0  : return    '禁用';     break;
        case 1  : return    '正常';     break;
        case 2  : return    '待审核';   break;
        default : return    false;      break;
    }
}

// 获取数据的状态操作
function show_status_op($status) {
    switch ($status){
        case 0  : return    '启用';     break;
        case 1  : return    '禁用';     break;
        case 2  : return    '审核';       break;
        default : return    false;      break;
    }
}

/**
 * 获取文档的类型文字
 * @param string $type
 * @return string 状态文字 ，false 未获取到
 * @author huajie <banhuajie@163.com>
 */
function get_document_type($type = null){
    if(!isset($type)){
        return false;
    }
    switch ($type){
        case 1  : return    '目录'; break;
        case 2  : return    '主题'; break;
        case 3  : return    '段落'; break;
        default : return    false;  break;
    }
}

/**
 * 获取配置的类型
 * @param string $type 配置类型
 * @return string
 */
function get_config_type($type=0){
    $list = C('CONFIG_TYPE_LIST');
    return $list[$type];
}

/**
 * 获取配置的分组
 * @param string $group 配置分组
 * @return string
 */
function get_config_group($group=0){
    $list = C('CONFIG_GROUP_LIST');
    return $group?$list[$group]:'';
}

/**
 * select返回的数组进行整数映射转换
 *
 * @param array $map  映射关系二维数组  array(
 *                                          '字段名1'=>array(映射关系数组),
 *                                          '字段名2'=>array(映射关系数组),
 *                                           ......
 *                                       )
 * @author 朱亚杰 <zhuyajie@topthink.net>
 * @return array
 *
 *  array(
 *      array('id'=>1,'title'=>'标题','status'=>'1','status_text'=>'正常')
 *      ....
 *  )
 *
 */
function int_to_string(&$data,$map=array('status'=>array(1=>'正常',-1=>'删除',0=>'禁用',2=>'未审核',3=>'草稿'))) {
    if($data === false || $data === null ){
        return $data;
    }
    $data = (array)$data;
    foreach ($data as $key => $row){
        foreach ($map as $col=>$pair){
            if(isset($row[$col]) && isset($pair[$row[$col]])){
                $data[$key][$col.'_text'] = $pair[$row[$col]];
            }
        }
    }
    return $data;
}

/**
 * 动态扩展左侧菜单,base.html里用到
 * @author 朱亚杰 <zhuyajie@topthink.net>
 */
function extra_menu($extra_menu,&$base_menu){
    foreach ($extra_menu as $key=>$group){
        if( isset($base_menu['child'][$key]) ){
            $base_menu['child'][$key] = array_merge( $base_menu['child'][$key], $group);
        }else{
            $base_menu['child'][$key] = $group;
        }
    }

}

/**
 * 获取参数的所有父级分类
 * @param int $cid 分类id
 * @return array 参数分类和父类的信息集合
 * @author huajie <banhuajie@163.com>
 */
function get_parent_category($cid){
    if(empty($cid)){
        return false;
    }
    $cates  =   M('Category')->where(array('status'=>1))->field('id,title,pid')->order('sort')->select();
    $child  =   get_category($cid); //获取参数分类的信息
    $pid    =   $child['pid'];
    $temp   =   array();
    $res[]  =   $child;
    while(true){
        foreach ($cates as $key=>$cate){
            if($cate['id'] == $pid){
                $pid = $cate['pid'];
                array_unshift($res, $cate); //将父分类插入到数组第一个元素前
            }
        }
        if($pid == 0){
            break;
        }
    }
    return $res;
}

/**
 * 检测验证码
 * @param  integer $id 验证码ID
 * @return boolean     检测结果
 * @author 麦当苗儿 <zuojiazi@vip.qq.com>
 */
function check_verify($code, $id = 1){
    $verify = new \Think\Verify();
    return $verify->check($code, $id);
}

/**
 * 获取当前分类的文档类型
 * @param int $id
 * @return array 文档类型数组
 * @author huajie <banhuajie@163.com>
 */
function get_type_bycate($id = null){
    if(empty($id)){
        return false;
    }
    $type_list  =   C('DOCUMENT_MODEL_TYPE');
    $model_type =   M('Category')->getFieldById($id, 'type');
    $model_type =   explode(',', $model_type);
    foreach ($type_list as $key=>$value){
        if(!in_array($key, $model_type)){
            unset($type_list[$key]);
        }
    }
    return $type_list;
}

/**
 * 获取当前文档的分类
 * @param int $id
 * @return array 文档类型数组
 * @author huajie <banhuajie@163.com>
 */
function get_cate($cate_id = null){
    if(empty($cate_id)){
        return false;
    }
    $cate   =   M('Category')->where('id='.$cate_id)->getField('title');
    return $cate;
}

 // 分析枚举类型配置值 格式 a:名称1,b:名称2
function parse_config_attr($string) {
    $array = preg_split('/[,;\r\n]+/', trim($string, ",;\r\n"));
    if(strpos($string,':')){
        $value  =   array();
        foreach ($array as $val) {
            list($k, $v) = explode(':', $val);
            $value[$k]   = $v;
        }
    }else{
        $value  =   $array;
    }
    return $value;
}

// 获取子文档数目
function get_subdocument_count($id=0){
    return  M('Document')->where('pid='.$id)->count();
}



 // 分析枚举类型字段值 格式 a:名称1,b:名称2
 // 暂时和 parse_config_attr功能相同
 // 但请不要互相使用，后期会调整
function parse_field_attr($string) {
    if(0 === strpos($string,':')){
        // 采用函数定义
        return   eval('return '.substr($string,1).';');
    }elseif(0 === strpos($string,'[')){
        // 支持读取配置参数（必须是数组类型）
        return C(substr($string,1,-1));
    }
    
    $array = preg_split('/[,;\r\n]+/', trim($string, ",;\r\n"));
    if(strpos($string,':')){
        $value  =   array();
        foreach ($array as $val) {
            list($k, $v) = explode(':', $val);
            $value[$k]   = $v;
        }
    }else{
        $value  =   $array;
    }
    return $value;
}

/**
 * 获取行为数据
 * @param string $id 行为id
 * @param string $field 需要获取的字段
 * @author huajie <banhuajie@163.com>
 */
function get_action($id = null, $field = null){
    if(empty($id) && !is_numeric($id)){
        return false;
    }
    $list = S('action_list');
    if(empty($list[$id])){
        $map = array('status'=>array('gt', -1), 'id'=>$id);
        $list[$id] = M('Action')->where($map)->field(true)->find();
    }
    return empty($field) ? $list[$id] : $list[$id][$field];
}

/**
 * 根据条件字段获取数据
 * @param mixed $value 条件，可用常量或者数组
 * @param string $condition 条件字段
 * @param string $field 需要返回的字段，不传则返回整个数据
 * @author huajie <banhuajie@163.com>
 */
function get_document_field($value = null, $condition = 'id', $field = null){
    if(empty($value)){
        return false;
    }

    //拼接参数
    $map[$condition] = $value;
    $info = M('Model')->where($map);
    if(empty($field)){
        $info = $info->field(true)->find();
    }else{
        $info = $info->getField($field);
    }
    return $info;
}

/**
 * 获取行为类型
 * @param intger $type 类型
 * @param bool $all 是否返回全部类型
 * @author huajie <banhuajie@163.com>
 */
function get_action_type($type, $all = false){
    $list = array(
        1=>'系统',
        2=>'用户',
    );
    if($all){
        return $list;
    }
    return $list[$type];
}

/*
 * 清除缓存
 * */
function  _system_clearRuntimeDir()
{
    //清文件缓存
    $dirs = array('./Runtime/');
    @mkdir('Runtime',0777,true);
    //清理缓存
    foreach($dirs as $value) {
        _es_rmdirr($value);
    }
}
/*
 * 设置目录权限
 * */
function _es_rmdirr($dirname) {
    if (!file_exists($dirname)) {
        return false;
    }
    if (is_file($dirname) || is_link($dirname)) {
        //日志文件不删除
        if(!strpos($dirname,'Logs')){
            return unlink($dirname);
        }else{
            return true;
        }
    }
    $dir = dir($dirname);
    if($dir){
        while (false !== $entry = $dir->read()) {
            if ($entry == '.' || $entry == '..') {
                continue;
            }
            //递归
            _es_rmdirr($dirname . DIRECTORY_SEPARATOR . $entry);
        }
    }
    $dir->close();
    return rmdir($dirname);
}

//获取操作记录返回的消息
function getReturnMsg($value,$msg=array('success'=>'操作成功!','error'=>'操作失败!')){
    $returnMsg='';
    if(intval($value)>0){
        $returnMsg=$msg['success'];
    }else{
        $returnMsg=$msg['error'];
    }
    return $returnMsg;
}

//获取交易用户类型
function getDealUserType($val){
    $str='';
    switch(intval($val)){
        case 1: $str='供应商'; break;
        case 2: $str='客户'; break;
        case 3: $str='内部用户'; break;
        default: '';
    }
    return $str;
}

 function getStockOutOrderType($val){
     $str='';
     switch(intval($val)){
         case 1: $str='本地销售'; break;
         case 2: $str='采购退货'; break;
         case 3: $str='澳买销售出库'; break;
         default: '';
     }
     return $str;
}

//详情查看是显示的标题
function getDialogTitle($val){
    $str='';
    $orderTypeArr=C('ORDER_TYPE_NAME');
    if($orderTypeArr!=null){
        $str=$orderTypeArr[$val]."单详情";
    }
    return $str;
}

//单据打印时显示的标题名称
function getPrintPageTitle($val){
    $str='';
    $orderTypeArr=C('ORDER_TYPE_NAME');
    if($orderTypeArr!=null){
        $str=$orderTypeArr[$val]."单";
    }
    return $str;
}

//获取操作的业务类型
function getBusinessType($val){
     $str='';
     $orderTypeArr=C('ORDER_TYPE_NAME');
     if($orderTypeArr!=null){
         $str=$orderTypeArr[$val];
     }
     return $str;
}

//获取订单的支付类型
function getOrderPayType($val){
    $str='';
    $payTypeArr=C('ORDER_PAY_TYPE');
    if($payTypeArr!=null){
        $str=$payTypeArr[$val];
    }
    return $str;
}

//获取供应商的类型
function getSupplierType($val){
    $str='';
    $supplierTypeArr=C('SUPPLIER_TYPE');
    if($supplierTypeArr!=null){
        $str=$supplierTypeArr[$val];
    }
    return $str;
}

/*
 * 判断是否为代销供应商
 * @return: 是 返回供应商id ; 否 返回0
 * */
function isConsignmentSupplier(){
    $supplierId=0;
    $userInfo=session('user_auth');
    if($userInfo['supplier_type']>0){
        $supplierId=$userInfo['cpinfo_id'];  //代销供应商id
    }
    return $supplierId;
}

/*
 * 获取用户组的groupkey 值
 * @return: 是 返回供应商id ; 否 返回0
 * */
function getUserGroupKey(){
    $userId=is_login();
    $groupId=M('auth_group_access')->where(array('uid'=>$userId))->getField('group_id');
    $groupKey=M('auth_group')->where(array('id'=>$groupId))->getField('group_key');
    return $groupKey;
    
}

/*
 *订单记录表状态
 * */
function getOrderStatus($val){
    $str='';
    switch(intval(intval($val))){
        case 0: $str='正常'; break;
        case 1: $str='退款'; break;
        case 2: $str='挂起'; break;
        default: '';
    }
    return $str;
 }

/*
 * 获取商品的采购类型
 * */
function getPurchaseType($val){
    $str='';
    $supplierTypeArr=C('PURCHASE_TYPE');
    if($supplierTypeArr!=null){
        $str=$supplierTypeArr[$val];
    }
    return $str;
}
/*
 * 获取盘点单的状态
 * */
function getCheckStatus($val){
    $str='';
    $checkArr=C('CHECK_RECEIPTS');
    if($checkArr!=null){
        $str=$checkArr[$val];
    }
    return $str;
}
/*
 *获取各类单据的字符串的状态值
 *@param int $val 显示的值
 *@param int $type 类别 
 * */
function getStringStatusVal($val,$type){
    $str=''; //状态字符串
    $statusArr=array();  //状态字符串数组集合
    switch(intval($type)){
        case 1:$statusArr=C('APPLY_INOUT_STATUS');break;  //申请单据状态数据
        case 2:$statusArr=C('USER_GROUP_STATUS');break;   //用户组状态字符串值
        case 3:$statusArr=C('WORKFLOWTYPETitle');break;   //申请流程名称
        case 4:$statusArr=C('RETAIL_ORDER_TYPE');break;   //零售单类型名称
        default:$statusArr=array('0'=>'无效状态值');
    }
    if($statusArr!=null){
        $str=$statusArr[$val];
    }
    return $str;
}


/*PHPExcel导出案例*/
function phpExcelRetailOrderData($data,$field_titles,$title,$type){
    require_once('./ThinkPHP/Library/Vendor/PHPExcelClasses/PHPExcel.php'); 
    require_once('/ThinkPHP/Library/Vendor/PHPExcelClasses/PHPExcel/Writer/Excel2007.php'); 
    require_once('/ThinkPHP/Library/Vendor/PHPExcelClasses/PHPExcel/IOFactory.php');
    // Create new PHPExcel object
    $objPHPExcel = new PHPExcel();
    //Set properties 设置文件属性  
    $objPHPExcel->getProperties()->setCreator("Maarten Balliauw");  
    $objPHPExcel->getProperties()->setLastModifiedBy("Maarten Balliauw");  
    $objPHPExcel->getProperties()->setTitle("Office 2007 XLSX Test Document");  
    $objPHPExcel->getProperties()->setSubject("Office 2007 XLSX Test Document");  
    $objPHPExcel->getProperties()->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.");  
    $objPHPExcel->getProperties()->setKeywords("office 2007 openxml php");  
    $objPHPExcel->getProperties()->setCategory("Test result file");

    $objActIndex=$objPHPExcel->setActiveSheetIndex(0);
    //输出第一行
    $objActIndex->setCellValue('A1', $field_titles[0])
             ->setCellValue('B1', $field_titles[1])
             ->setCellValue('C1', $field_titles[2])
             ->setCellValue('D1', $field_titles[3])
             ->setCellValue('E1', $field_titles[4])
             ->setCellValue('F1', $field_titles[5]);

    //实例化当期操作表格的对象
    $objActSheet = $objPHPExcel->getActiveSheet();

    //设置默认宽度以及对齐方式
    $aligment = $objActSheet->getDefaultStyle()->getAlignment();
    $aligment->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
    $aligment->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);

    //设置默认的宽度和行高
    $objActSheet->getDefaultColumnDimension()->setWidth(20);     //默认宽度
    $objActSheet->getDefaultRowDimension()->setRowHeight(25);//默认高度

    //设置单元格字体和边框
    $numArr=array();  //表格列数
    for ($i=65; $i<89; $i++){
        $temp = chr($i);
        $style = $objActSheet->getStyle($temp."1");
        $style->getFont()->setBold(true);
        $style->getFont()->setName('微软雅黑');
        array_push($numArr,$temp); 
    }     
    //输出内容
    $totalMoney=0;
    $data_count=count($data);     
    for($i=0;$i<$data_count+1;$i++){
       $totalMoney+=floatVal($data[$i]['order_money']); 
       if($i==$data_count){
            $objPHPExcel->getActiveSheet()->mergeCells('A'.($i+2).':C'.($i+2)); 
            $objPHPExcel->setActiveSheetIndex(0)
              ->setCellValue($numArr[3].($i+2), '总计：')
              ->setCellValue($numArr[4].($i+2), "$".$totalMoney);
              //字体加粗、颜色就红色
              $style= $objActSheet->getStyle($numArr[3].($i+2));
              $style->getFont()->setBold(true);
              $style->getFont()->setName('微软雅黑');
              $style2 = $objActSheet->getStyle($numArr[4].($i+2));
              $style2->getFont()->setBold(true);
              $style2->getFont()->setName('微软雅黑');
              $style2->getFont()->getColor()->setARGB('FFD40808');
        }else{
             $objPHPExcel->setActiveSheetIndex(0)
              ->setCellValue($numArr[0].($i+2), $data[$i]['order_sn'])
              ->setCellValue($numArr[1].($i+2), $data[$i]['consignee'])
              ->setCellValue($numArr[2].($i+2), getOrderPayType($data[$i]['pay_type']))
              ->setCellValue($numArr[3].($i+2), getStringStatusVal($data[$i]['retail_order_type'],4))
              ->setCellValue($numArr[4].($i+2), date('Y-m-d H:i:s',$data[$i]['packtime']))
              ->setCellValue($numArr[5].($i+2), $data[$i]['order_money']);
        }
    }

    //浏览器直接输出
    header('Content-Type: application/vnd.ms-excel');  
    header("Content-Disposition: attachment;filename='".$title.".xls'");  
    header('Cache-Control: max-age=0');  
    $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel,'Excel5');
    $objWriter->save('php://output'); 
}
//得到属性组大类
function getGoodsAttrCategorys(){
    $goods_attribute_category_list=M('goods_attribute_category')->field('id,name,remark')->order('sort desc')->select();
    return $goods_attribute_category_list;
}

//根据大类ID获取当前类别下的属性分组和属性分组下的属性值
function getGoodsAttributeGroupAndValues($cat_id){
    //如果没有传入类别ID，则返回空对象
    if(!$cat_id){
        return null;
    }

    $goods_attribute_group_list=M('goods_attribute_group')->field('id,name,remark')
    ->where(array('cat_id'=>$cat_id,'is_delete'=>0))->order('sort desc')->select();
    //循环属性组，根据属性组ID查询得到属性值
    foreach ($goods_attribute_group_list as $key => $value) {

        $attribute_group_id=$value['attribute_group_id'];
        
        //查询只查询前台显示的字段，节省内存和加快查询速度
        $goods_attribute_value_list=M('goods_attribute_value')->field('id,value')
    ->where(array('attribute_group_id'=>$attribute_group_id,'is_delete'=>0))->order('sort desc')->select();

        $goods_attribute_group_list[$key]['_child']=$goods_attribute_value_list;
    }

    return $goods_attribute_group_list;
}

/*
 *php可逆加密算法
 * */
function pmPwdEncrypt($string, $operation = 'DECODE', $key = '', $expiry = 0) {
    //动态密匙长度，相同的明文会生成不同密文就是依靠动态密匙
    $ckey_length = 4;
    // 密匙
    $key = md5($key ? $key : $GLOBALS['discuz_auth_key']);
    // 密匙a会参与加解密
    $keya = md5(substr($key, 0, 16));
    // 密匙b会用来做数据完整性验证
    $keyb = md5(substr($key, 16, 16));
    // 密匙c用于变化生成的密文
    $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length):
        substr(md5(microtime()), -$ckey_length)) : '';
    // 参与运算的密匙
    $cryptkey = $keya.md5($keya.$keyc);
    $key_length = strlen($cryptkey);
    // 明文，前10位用来保存时间戳，解密时验证数据有效性，10到26位用来保存$keyb(密匙b)，
    //解密时会通过这个密匙验证数据完整性
    // 如果是解码的话，会从第$ckey_length位开始，因为密文前$ckey_length位保存 动态密匙，以保证解密正确
    $string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) :
        sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string;
    $string_length = strlen($string);
    $result = '';
    $box = range(0, 255);
    $rndkey = array();
    // 产生密匙簿
    for($i = 0; $i <= 255; $i++) {
        $rndkey[$i] = ord($cryptkey[$i % $key_length]);
    }
    // 用固定的算法，打乱密匙簿，增加随机性，好像很复杂，实际上对并不会增加密文的强度
    for($j = $i = 0; $i < 256; $i++) {
        $j = ($j + $box[$i] + $rndkey[$i]) % 256;
        $tmp = $box[$i];
        $box[$i] = $box[$j];
        $box[$j] = $tmp;
    }
    //核心加解密部分
    for($a = $j = $i = 0; $i < $string_length; $i++) {
        $a = ($a + 1) % 256;
        $j = ($j + $box[$a]) % 256;
        $tmp = $box[$a];
        $box[$a] = $box[$j];
        $box[$j] = $tmp;
        // 从密匙簿得出密匙进行异或，再转成字符
        $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
    }
    if($operation == 'DECODE') {
        // 验证数据有效性，请看未加密明文的格式
        if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) &&
            substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) {
            return substr($result, 26);
        } else {
            return '';
        }
    } else {
        // 把动态密匙保存在密文里，这也是为什么同样的明文，生产不同密文后能解密的原因
        // 因为加密后的密文可能是一些特殊字符，复制过程可能会丢失，所以用base64编码
        return $keyc.str_replace('=', '', base64_encode($result));
    }
}

//移除文本里所有的空格（文本间，文本左右）
function RemoveStringSpace($str){
   if(empty($str)){
     return trim($str);
   }

   return str_replace(' ','',$str);
}

/*
 *计算代码的执行时间
 * */
function getmicrotime()
{
    list($usec, $sec) = explode(" ",microtime());   //赋值
    return ((float)$usec + (float)$sec);
}


/*
 *添加空格
 * */
function  print_nbsp($count=0){
    $nbsp="";
    for($i=0;$i<$count;$i++){
        $nbsp.="&nbsp;&nbsp;&nbsp;";
    }
    return $nbsp;
}

